<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 单例模式
    单例模式：保证一个类仅有一个实例，并提供一个访问它的全局访问点。
    单例模式是一种对象创建型模式。
    单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例，这个类称为单例类，它提供全局访问点，可以直接访问它而无需实例化。
    -->
    <script>
        // 透明版 单例模式
        // var CreateStr = (function () {
        //     var instance = null;

        //     return function (str) {
        //         if (instance) {
        //             return instance;
        //         }
        //         this.str = str;
        //         return instance = this;
        //     }
        // })();

        // CreateStr.prototype.getStr = function () {
        //     console.log(this.str);
        // }

        // let a = new CreateStr('s1');
        // let b = new CreateStr('s2');

        // console.log('a ------>', a);    // { str: 's1' }
        // console.log('b ------>', b);    // { str: 's1' }
        // a.getStr();     //  s1
        // b.getStr();     //  s1
        // console.log(a === b);   // true



        // 代理版 单例模式
        function CreateStr(str) {
            this.str = str;
            this.getStr();
        }

        CreateStr.prototype.getStr = function () {
            console.log(this.str);
        }

        var ProxyObj = (function () {
            var instance = null;
            return function (str) {
                if (!instance) {
                    instance = new CreateStr(str);
                }
                return instance;
            }
        })();

        var a = new ProxyObj('s1');
        var b = new ProxyObj('s2');
        console.log('a ------>', a);    // CreateStr { str: 's1' }
        console.log('b ------>', b);    // CreateStr { str: 's1' }
        a.getStr();     //  s1
        b.getStr();     //  s1
        console.log('b ------>', a === b);  // true
    </script>
</body>

</html>